function RTinputMic(duration, nBlocks)

%
% función RTinputMic(duration, nBlocks)
%
% Esta función graba: 
%  - datos de audio desde la entrada de la tarjeta de sonido
%  
%  - Sistema Operativo: Windows	
%
% Característica particular de esta función: 
%  - se graban 'nBlocks' segmentos de audio de tamaño 'duration'
%  
%
%
%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
% ARGUMENTOS de entrada
% 
% duration[segundos]: 	es la duración de cada segmento de audio;
% nBlocks[n]:   	número de bloques a grabar.
% 
% \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

clc;
fprintf('--------------------------------------------------------------------------\n')
fprintf('Adquisición en Tiempo Real de la entrada de Micrófono para procesamiento de voz.\n\n');
fprintf('Paula Sanz Leon\n');
fprintf('Ingeniería Biomédica\n');
fprintf('--------------------------------------------------------------------------\n')

warning off;

% Abrir entrada de tarjeta de sonido:      
ai = analoginput('winsound');
addchannel(ai,1);

%frecuencia de muestreo
fs = 22050; 	
%Puede ser la mitad, 11025HZ. la f máx de la voz humana es menor a 8KHz.	

NFFT = 16000 / 100;
set (ai, 'FrecuenciadeMuestreo', fs);
set (ai, 'MuestrasporTrigger', duration*fs);
numOfProcessedBlocks = 0;



scrsz = get(0, 'ScreenSize');
%figure('Position', [1 scrsz(4) scrsz(3) scrsz(4)]);
W = 25; %ancho
F = figure;
set(F,'Position', [W 0 scrsz(3)-W scrsz(4)-3*W]);

DifferencesAudio = zeros(nBlocks,1);

bufStdZ = zeros(5,1);
bufMeanZ = zeros(5,1);
bufProc = zeros(5,1);

for (i=1:nBlocks)
	
    
 	% comienza proceso de grabación:
	start(ai);
	C1 = clock;
    
	           
    	%Si algún segmento está en el buffer:
	if ((i>1)        
        	numOfProcessedBlocks = numOfProcessedBlocks + 1;        
        	% re-sample (16KHz) the current segment:        
        	tempX = imresize(x, [(16000/22050)*length(x) 1]);
        	if (numOfProcessedBlocks==1)
            		tempXPrev = tempX;
        	end
                        
        	time = (i-1)*duration+1/16000: 1/16000 :i*duration;        
        
        % dibuja el bloque de sonido actual:
        	subplot(2,4,1);        
	        Pl = plot(time, tempX); 
		axis([min(time) max(time) -1 1]);
		title('Bloque de Sonido Actual');

		S  = log(abs(specgram(tempX,NFFT,16000,NFFT,0))); % Segmento Actual
		Sp = log(abs(specgram(tempXPrev,NFFT,16000,NFFT,0)));
		
		% Dibuja el espectrograma del bloque actual:
		subplot(2,4,3); specgram(tempX,NFFT,16000,NFFT,0); title('Spectogram');
		              
		SpecDiff = abs(S - Sp);
		DifferencesAudio(i-1) = 100 * mean(mean(SpecDiff)) / mean(mean(abs(S)));
		
		% Zero Crossing Rate o Tasa de Cruces por Cero.
		Z = zcr(tempX, 0.050*16000, 0.050*16000, 16000);
		meanZ = mean(Z);
		stdZ = std(Z);
		bufMeanZ(1:end-1) = bufMeanZ(2:end);        
		bufMeanZ(end) = meanZ;
		bufStdZ(1:end-1) = bufStdZ(2:end);
		bufStdZ(end) = stdZ;
		
		subplot(2,4,2); 
		timeZ = (i-5)*duration+duration: duration :i*duration;
		plot(timeZ,bufMeanZ);
		hold on;
		plot(timeZ,bufStdZ,'r');        
		legend('Media de ZCR','Desviación Estándar of ZCR');
		axis([min(timeZ) max(timeZ) 0 0.50]);
		hold off;
		title('Media y Desviación de la secuencia de ZCR')

		% Encuentra la diferencia espectral del audio

		IM_DIFF_PLOT_AUDIO = zeros(100,2);
        	if (DifferencesAudio(i-1)<100)
            		IM_DIFF_PLOT_AUDIO(end-DifferencesAudio(i-1):end,:) = 1;
        	else
            		IM_DIFF_PLOT_AUDIO(1:end,:) = 1;
        	end
        		subplot(2,4,4); imshow(IM_DIFF_PLOT_AUDIO,[]);
        		drawnow;               
        		tempXPrev = tempX;	end
    
	C2 = clock;
	Etime = etime(C2,C1);
	bufProc(1:end-1) = bufProc(2:end);
	bufProc(end) = 100 * Etime / duration;
	timeP = (i-5)*duration+duration: duration :i*duration;    
	subplot(2,4,5); 
	plot(timeP, bufProc); 
	axis([min(timeP) max(timeP) 0 100]);
	title('Performance');    
	    
			           
	if (strcmp(get(ai,'En ejecución'),'On')==1)
		x = getdata(ai, duration * fs);         
		if (i>1) 
			xPrev = x; 
		else 
			xPrev = zeros(duration*fs,1); 
		end        
	else
		x = zeros(duration*fs,1);
		xPrev = x;
		fprintf('%30s\n','Problemas de lectura de entrada!!!!!!');
		% X = [X zeros(1,22050)];
	end
            
end


% No dejar evidencias
delete(ai);
clear ai

